Vlakna - zpracovani zpravy vlakna v hlavnim vlakne - konci chybou

Otázka od: Ing. Jiri Sokol

19. 10. 2004 10:34

Ahoj.
Navazuji na svuj predchozi prispevek, tak se uz nebudu rozepisovat co a jak
delam. Jde o to, ze kdyz mi vlakno dojede na nejakou vyjimku, tak chci vyloucit
chyby, ktere by to mohlo zpusobovat nasledne a chtel bych toto vlykno, ktere
bezi porad ukonict, uvolnit a znovu vytvorit a pripravit ho na dalsi spusteni.
To jsem chtel resit tak, do hlavniho vlakna si poslu zpravu. Zpravu odchytim,
vim, ze je to s pozadavkem o:
Vlakno.Kill(INFINITE);
FreeAndNil(Vlakno);
a pak chci pokracovat
Vlakno.Create; (mam vlastni constructor), ale v nem to zhuci na vyjimku.
Jedine, jak to muzu provest je, ze jakmile hlavni vlakno aplikace odchyti
zpravu vlakna o jeho "reset", tak si samo na sebe posle jinou zpravu, ve ktere
se provedou ty zminene 3 radky uvedene vyse. VSE je OK...

Znamena to, ze kdyz mi prijde zpravy z nejakeho objektu, tak po dobu zpracovani
teto zpravy se NESMIM pokusit ten objekt zrusit a znovu vytvorit? Proc? Zpravy
si posilam pre POSTMessage, coz by melo znamenat, ze jdou asynchronne...

Muzete mi to, prosim, nekdo vyvsetlit?
Diky
Jirka
--------------------------------------------------
Ing. Jiri Sokol; jiri.sokol@seznam.cz; 972 231 187
D6Prof+SP3; WinXPProf+SP1; FB 1.5.0
programator amater



Odpovedá: Petr Fejfar

19. 10. 2004 10:49

Ing. Jiri Sokol wrote:

> Vlakno.Create; (mam vlastni constructor), ale v nem to zhuci na
> vyjimku.

A to je problem zjistit trasovanim popr. logovanim,
co se tam deje a kde a na jakou vyjimku to spadne?

pf


Odpovedá: delphin@post.cz

19. 10. 2004 10:13

> To jsem chtel resit tak, do hlavniho vlakna si poslu zpravu. Zpravu
odchytim, vim, ze je to s pozadavkem o:
> Vlakno.Kill(INFINITE);
> FreeAndNil(Vlakno);
> a pak chci pokracovat
> Vlakno.Create; (mam vlastni constructor), ale v nem to zhuci na vyjimku.

Nema tam byt spise TVlakno.Create ?


Odpovedá: Jiri Cincura

19. 10. 2004 10:54

Ing. Jiri Sokol wrote:
> Vlakno.Create; (mam vlastni constructor), ale v nem to zhuci na vyjimku.

Nemelo by spis byt Vlakno := Tvlakno.Create;

???

--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web:
  http://www.cincura.net/
  http://photo.cincura.net/
  http://phorum.cincura.net/
---
A i kdyz je nase doba obtizna a zmatena, je podnetna a vyplnena
prilezitostmi. And if our times are difficult and perplexing, so are they
challenging and filled with opportunity. -Robert F. Kennedy, 1961



Odpovedá: Ing. Jiri Sokol

19. 10. 2004 12:54

> Od: Petr Fejfar <development@callnet.cz>
> Datum: 19.10.2004 11:53:22
>
> Ing. Jiri Sokol wrote:
>
> > Vlakno.Create; (mam vlastni constructor), ale v nem to zhuci na
> > vyjimku.
>
> A to je problem zjistit trasovanim popr. logovanim,
> co se tam deje a kde a na jakou vyjimku to spadne?
>
> pf
>
Ahoj.
Mam to vyzkouseno, ze se ta chyba 100% projevi - vem si ten priklad, kterym jsi
mi vysvetloval to workflow vlaken, misto semaphoru jsem dal event. Pak do
procedure TExclusiveThread._RequestExecute dej PostMessage(From1.Handle,
wm_user+10, self.ThreadID, 255);

V tele Form jedna jsem si dal jeden button, ktery mi udela:
Vlakno - globalni prommena TExclusiveThread
Vlakno:=TExclusiveThread.Create; (omlouvam se, ze jsem to v tech predchozich
pripevcich zvrtal, byl to jenom preklep - vytvarim ho proste takhle)
Vlakno.Resume;
Sleep(700);//jen aby nekdo nepojal podezreni, ze to je moc rychle  
a konec

Ted mam vlkano, ktere jsem vytvoril, ktere se spustilo prave jednou probehlo
pres _Body a pres _RequestExecute a teda poslalo zpravu form1 a ted je ve stavu
klidu a ceka na zavolani udalosti.

ve form1 mam

type form1 = class (TFrom)
     ...
     public
       procedure VlaknoMes(var Mes: TMessage); message wm_user+10;
     ...
     end;

procedure TForm1.VlaknoMes(var Mes: TMessage);
begin
  if (Vlakno<>nil)and(Mes.WParam = Vlakno.ThreadID) then
  begin
    if Mes.LParam = 255 then
    begin
      Vlakno.Kill(INFINITE);
      FreeAndNil(Vlakno);
      Vlakno:=TExclusiveThread.Create; //<--- tohle se nikdy neprovede
//zkousel jsem i tohle:
// if Vlkano = nil then Vlakno:=TExclusiveThread.Create; //vysledek je stejny
 
    end;
  end;
end;

Pak to vzdycky konci tridu chyby EAccessViolation, chyba AccessViolation neco s
pameti na adrese... zhuci to pri vytvareni toho vlkana:
constructor TExclusive.Create;
begin
  inherited Create(TRUE); //<--- presne tady
  ...
end;


Tak kde je zakopany pes?
Diky
JIrka

Odpovedá: Petr Fejfar

19. 10. 2004 15:20

Ing. Jiri Sokol wrote:

> Pak do procedure TExclusiveThread._RequestExecute dej
> PostMessage(From1.Handle, wm_user+10, self.ThreadID, 255);

Sice nevim, co je metoda _RequestExecute, ale pokud nemas
nejake podezrele akce (= zavisle na jinych prostredcich) u predka
toho threadu, tak konstrukce

       Vlakno:=TExclusiveThread.Create; //<--- tohle se nikdy neprovede

musi vytvorit novou instanci threadu. Kdyz pada ten konstruktor na AV, tak
to spis vypada na nejaky prepis pameti apod.

pf